// #include <iostream>
// #include <string>
// #include <vector>
// #include <algorithm>
// using namespace std;

// 汉诺塔

// cpp
// int main()
// {
//     long long step[40] = { 0 };
//     long long tmp[60] = { 0 };
//     for (int i = 1; i <= 31; i++)
//     {
//         tmp[i] = 0x0fffffffffffffff;
//         step[i] = step[i - 1] * 2 + 1;
//     }
//     step[0] = 0;
//     step[1] = 1;
//     tmp[0] = 0;
//     // 三个柱子的递归方程 d[i] = 2 * d[i-1] + 1
//     // 四个柱子的递归方程 f[i] = min(f[i], 2 * f[m] + d[i-m]);
//     for (int i = 1; i <= 31; i++)
//     {
//         for (int j = 0; j < i; j++)
//         {
//             tmp[i] = min(tmp[i], tmp[j] * 2 + step[i - j]);
//         }
//     }
//     int n = 1;
//     cin >> n;
//     printf("%lld\n", tmp[n]);
// }

#include <stdio.h>
int main()
{
    long long step[40] = {0};
    long long tmp[60] = {0};
    for (int i = 1; i <= 31; i++)
    {
        tmp[i] = 0x0fffffffffffffff;
        step[i] = step[i - 1] * 2 + 1;
    }
    step[0] = 0;
    step[1] = 1;
    tmp[0] = 0;
    // 三个柱子的递归方程 d[i] = 2 * d[i-1] + 1
    // 四个柱子的递归方程 f[i] = min(f[i], 2 * f[m] + d[i-m]);
    for (int i = 1; i <= 31; i++)
    {
        for (int j = 0; j < i; j++)
        {
            tmp[i] = tmp[i] < tmp[j] * 2 + step[i - j] ? tmp[i] : tmp[j] * 2 + step[i - j];
        }
    }
    int n = 1;
    scanf("%d", &n);
    printf("%lld\n", tmp[n]);
}

// class Student
// {
// public:
//     int score;
//     std::string name;
//     std::string nick;

// };

// int cmp(const Student& a, const Student& b)
// {
//     return a.score - b.score;
// }

// int main()
// {
//     vector<Student> v;
//     int n = 0;
//     cin >> n;
//     for (int i = 0; i < n; ++i)
//     {
//         Student s;
//         cin >> s.score;
//         cin >> s.name;
//         if(s.score == 0) s.nick = "Bad";
//         else if(s.score < 200) s.nick = "Not good";
//         else if(s.score < 300) s.nick = "Bronze medal";
//         else if(s.score < 400) s.nick = "Silver medal";
//         else s.nick = "Gold medal";
//         v.push_back(s);
//     }
//     sort(v.begin(), v.end(), cmp);
//     for (auto i = v.begin(); i < v.end(); ++i)
//     {
//         std::cout << i->name << " " << i->score << " " << i->nick << std::endl;
//     }

//     return 0;
// }

// class Student
// {
// public:
//     int ban;
//     int desk;
//     std::string name;
// };

// int cmp(const Student& a, const Student& b)
// {
//     if (a.ban < b.ban) return 1;
//     else if (a.ban > b.ban) return 0;
//     else
//     {
//         if (a.desk < b.desk) return 1;
//         else return 0;
//     }
//     return 0;
// }

// int main()
// {
//     vector<Student> v;
//     int n = 0;
//     cin >> n;
//     for (int i = 0; i < n; ++i)
//     {
//         Student s;
//         cin >> s.ban;
//         cin >> s.desk;
//         cin >> s.name;
//         v.push_back(s);

//     }
//     sort(v.begin(), v.end(), cmp);
//     for (auto i = v.begin(); i < v.end(); ++i)
//     {
//         std::cout << i->ban << " " << i->desk << " " << i->name << std::endl;
//     }

//     return 0;
// }

// int main()
// {
//     string s;
//     std::cin >>s;
//     std::swap(s[4], s[3]);
//     std::swap(s[1], s[0]);
//     std::cout << s <<std::endl;
//     return 0;
// }

// int main()
// {
//     int n = 0;
//     while(scanf("%d", &n) != EOF)
//     {
//         printf("%d\n", (n%10) + 2*(n%100/10) +3*(n%1000/100) + 4*(n%10000/1000));
//     }

//     return 0;
// }